from pathlib import Path

from loguru import logger

from mdtool.commands.base_command import Command
from mdtool.config_reader import Config
from mdtool.util import is_valid_dir

from ..markdown_document import MarkdownDocument


class CheckFormatForAllCommand(Command):
    """检查 所有Markdown 文件格式的命令"""

    def execute(self, config: Config, **kwargs) -> bool:
        articledir = config.get(Config.ARTICLE_DIR)
        if not articledir or not is_valid_dir(articledir):
            logger.error(f"无效的源目录：{articledir}")
            return False

        md_files = list(Path(articledir).glob("**/*.md"))
        if not md_files:  # 当前目录为空时，只发出一个警告，不中断程序
            logger.warning(f"目录 {articledir} 中没有找到 markdown 文件")
            return True

        invalid_files = []
        for md_file in md_files:
            relative_path = Path(md_file).relative_to(articledir)
            try:
                md_doc = MarkdownDocument.from_file(str(relative_path), articledir)
                ret = md_doc.check_format()
                if len(ret) > 0:
                    logger.warning(f"文件格式错误 {md_file}: {ret}")
                    invalid_files.append(str(md_file))
            except Exception as e:
                logger.error(f"检查文件出错 {md_file}: {e}")
                invalid_files.append(str(md_file))

        if invalid_files:
            logger.warning("以下文件格式不正确：")
            for file in invalid_files:
                logger.warning(f"\t{file}")
            return False
        logger.info("所有文件的格式都正确")
        return True
